using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using Random = UnityEngine.Random;

/// <summary>
/// 用于生成简单随机行走地牢的类，继承自 MonoBehaviour。
/// </summary>
public class SimpleRandomWalkDungeonGenerator : AbstractDungeonGenerator
{
    [SerializeField]
    public SimpleRandomWalkSO randomWalkParameters;

    
    /// <summary>
    /// 执行程序化生成地牢的方法。
    /// </summary>
    protected override void RunProceduralGeneration()
    {
        HashSet<Vector2Int> floorPositions = RunRandomWalk(randomWalkParameters, startPosition); // 获取地牢地板坐标集合
        tilemapVisualizer.PaintFloorTiles(floorPositions);//绘制地板瓦片
        WallGenerator.CreateWalls(floorPositions, tilemapVisualizer);//创建墙体
    }

    /// <summary>
    /// 执行随机行走算法生成地牢地板坐标的方法。
    /// </summary>
    /// <returns>地牢地板坐标的 HashSet。</returns>
    protected HashSet<Vector2Int> RunRandomWalk(SimpleRandomWalkSO parameters, Vector2Int position)
    {
        var currentPosition = position; // 当前位置初始化为起始位置
        HashSet<Vector2Int> floorPositions = new HashSet<Vector2Int>(); // 地板坐标的 HashSet
        for (int i = 0; i < parameters.iterations; i++)
        {
            var path = ProceduralGenerationAlgorithms.SimpleRandomWalk(currentPosition, parameters.walkLength); // 生成随机行走路径
            floorPositions.UnionWith(path); // 将路径添加到地板坐标集合中
            if (parameters.startRandomlyEachIteration)
            {
                currentPosition = floorPositions.ElementAt(Random.Range(0, floorPositions.Count)); // 如果需要每次迭代随机起始位置，则随机选择一个已生成的位置
            }
        }
        return floorPositions; // 返回地板坐标集合
    }
}
